package com.ce.pms.charge.dao.impl;

import java.util.ArrayList;
import java.util.List;
import java.util.regex.Pattern;

import org.hibernate.Query;

import com.ce.pms.base.dao.impl.PmsBaseDaoImpl;
import com.ce.pms.charge.dao.IChargeItemDao;
import com.ce.pms.charge.model.ChargeItemDomain;
import com.ce.pms.common.model.SysrefcodeDO;
import com.ce.pms.exception.BusinessException;
import com.ce.util.BlankUtil;
import com.sitechasia.webx.core.support.Page;

/**
 * 功能描述: 收费项目功能DAO处理类
 * <p>版权所有：中企动力
 * <p>未经本公司许可，不得以任何方式复制或使用本程序任何部分
 *
 * @author  胡煦
 * Create on:2008-8-7
 * Edit author:
 * Edit on:
 * 修改原因：

 */
public class ChargeItemDaoImpl extends PmsBaseDaoImpl<ChargeItemDomain> implements
		IChargeItemDao {
	/**
	 * 方法描述: 分页查询收费项目列表,根据传入的不同参数：收费项目名字，序号，创建时间进行排序，传入为null时默认按创建时间排序
	 * @author 胡煦
	 * Create on:2008-8-1
	 * @param int, int
	 * @return Page
	 * Edit author:
	 * Edit on:
	 * 修改原因：
	 */
	public Page queryChargeItemByPage(int pageNo,int pageSize,String orderStr){
		StringBuffer queryStr = new StringBuffer("FROM ChargeItemDomain cd where 1=1 order by ");
		if(!BlankUtil.isBlank(orderStr)){
			StringBuffer order = new StringBuffer("cd.").append(orderStr);
			queryStr.append(order);
			return this.pagedQueryByPageNo(queryStr.toString(), pageNo, pageSize);
		}
		queryStr.append("cd.sysInfo.sysDate");
		return this.pagedQueryByPageNo(queryStr.toString(), pageNo, pageSize);
	}

	/**
	 * 方法描述: 根据交易码ID查询收费项目
	 * @author 胡煦
	 * Create on:2008-12-3
	 * @param bizCodeId
	 * @return ChargeItemDomain
	 * Edit author:
	 * Edit on:
	 * 修改原因：
	 */
	public ChargeItemDomain findChargeItemDoByBizCode(Long bizCodeId){
		String queryStr = "FROM ChargeItemDomain cd WHERE cd.bizCode.id = ?";
		Query query = super.createQuery(queryStr,bizCodeId);
		return query.list()==null?null:(ChargeItemDomain) query.list().get(0);
	}

	/**
	 * 方法描述: 根据收费类型和走表类型查询收费项目
	 * @author 胡煦
	 * Create on:2008-8-22
	 * @param type
	 * @return List<ChargeItemDomain>
	 * Edit author:
	 * Edit on:
	 * 修改原因：
	 */
	public List<ChargeItemDomain> queryChargeItemListByType(String chrgType,String meterType){

		StringBuffer queryStr =  new StringBuffer("FROM ChargeItemDomain cd where cd.chrgType = ?");

		if(!BlankUtil.isBlank(meterType)){
			queryStr.append(" and cd.meterType = ?");
			return this.createQuery(queryStr.toString(),new Object[]{chrgType,meterType}).list();
		}

		Query query=this.createQuery(queryStr.toString(),new Object[]{chrgType});
		return query.list();
	}

	/**
	 * 方法描述: 根据收费项目名字模糊查询收费项目LIST
	 * @author 胡煦
	 * Create on:2008-8-26
	 * @param chargeItemName
	 * @return List<ChargeItemDomain>
	 * Edit author:
	 * Edit on:
	 * 修改原因：
	 */
	public List<ChargeItemDomain> queryChargeItemListByName(String chargeItemName){
		if(BlankUtil.isBlank(chargeItemName)){
			return this.findAll();
		}
		String queryStr =  "FROM ChargeItemDomain cd where cd.itemName like :name";
		Query query=this.createQuery(queryStr);
		query.setString("name", "%"+chargeItemName+"%");
		return query.list();
	}

	/**
	 * 方法描述: 查询最大的序号
	 * @author 胡煦
	 * Create on:2008-8-21
	 * @param
	 * @return short
	 * Edit author:
	 * Edit on:
	 * 修改原因：
	 */
	public Short getMaxSeqNo(){

		String queryStr = "SELECT MAX(cd.seqNo) FROM ChargeItemDomain cd";
		Query query = super.createQuery(queryStr);
		Short seqNo = (Short) query.uniqueResult();
		if(BlankUtil.isBlank(seqNo)){
			return (short)0;
		}
		return seqNo;
	}

	/**
	 * 方法描述: 根据收费项目名称查询记录数
	 *  注：新建判断chargeItemName的唯一性时，chargeItemId为null；修改判断chargeItemName的唯一性时，则需要传入修改前的chargeItemId<br>
	 * @author 胡煦
	 * Create on:2008-8-1
	 * @param chargeItemName
	 * @return Long
	 * Edit author:
	 * Edit on:
	 * 修改原因：
	 */
	public Long checkChargeItemNameIsOnly(String chargeItemName,Long chargeItemId){
		StringBuffer hql=new StringBuffer();
		List list = new ArrayList();
		list.add(chargeItemName);

		hql.append("select count(*) FROM  ChargeItemDomain cd WHERE cd.itemName = ? ");
		if(chargeItemId!=null){
			hql.append(" and cd.id <> ?");
			list.add(chargeItemId);
		}
		Query query=this.createQuery(hql.toString(), list.toArray());
		Object result=query.uniqueResult();
		return (result == null ? null : (Long)result );
	}

	/**
	 * 方法描述: 根据收费项目序号查询记录数
	 *  注：新建判断seqNo的唯一性时，chargeItemId为null；修改判断seqNo的唯一性时，则需要传入修改前的chargeItemId<br>
	 * @author 胡煦
	 * Create on:2008-7-30
	 * @param seqNo，chargeItemId
	 * @return Long
	 * Edit author:
	 * Edit on:
	 * 修改原因：
	 */
	public Long checkChargeItemSeqNoIsOnly(Short seqNo,Long chargeItemId){
		StringBuffer hql=new StringBuffer();
		List list = new ArrayList();
		list.add(seqNo);

		hql.append("select count(*) FROM  ChargeItemDomain cd WHERE cd.seqNo = ? ");
		if(chargeItemId!=null){
			hql.append(" and cd.id <> ?");
			list.add(chargeItemId);
		}
		Query query=this.createQuery(hql.toString(), list.toArray());
		Object result=query.uniqueResult();
		return (result == null ? null : (Long)result );
	}

	/**
	 * 方法描述:根据收费项目id字符串得到收费实体列表,如果传入chargeItemIds为空，则返回所有收费项目，filterSign 为true 则表示chargeItemIds是要过滤的id
	 * @author 胡煦
	 * Create on:2008-8-1
	 * @param chargeItemIds 字符串，如：1,2,3; filterSign
	 * @return List
	 * Edit author:
	 * Edit on:
	 * 修改原因：
	 */
	public List<ChargeItemDomain> queryChargeItemList(String chargeItemIds,boolean filterSign){
		List<ChargeItemDomain> list = new ArrayList<ChargeItemDomain>();
		if(BlankUtil.isBlank(chargeItemIds)){
			return findAll();
		}
		if (!Pattern.matches(SysrefcodeDO.REGEX_ID_JOIN_STRING, chargeItemIds)) {
			throw new BusinessException("common:id_join_string_format_exception",BusinessException.WARNING);
		}

		String queryStr = "FROM ChargeItemDomain cd WHERE cd.id :chooseStrategy (:idString) ";
		String chooseStrategy = "IN";
		if (filterSign) {
			chooseStrategy = "NOT IN";
		}
		queryStr=queryStr.replace(":chooseStrategy", chooseStrategy);
		queryStr=queryStr.replace(":idString", chargeItemIds);
		Query query=this.createQuery(queryStr);
		list = query.list();

		return list;
	}
}
